import java.util.HashMap;

public class code1 {
//    力扣 150 无重复字符的最长子串
public int lengthOfLongestSubstring(String s) {
    // 这道题目是相对于滑动窗口比较简单的题目，但是基本上就是解决滑动窗口问题的基本思路
    // 对于滑动窗口问题，就是通过 hash 表和 双指针 共同来实现的
    // hash 表来记录这个元素出现的
    // 双指针进行移动，通过双指针之间的距离来判断当前合适的最大长度
    if (s.length() == 0) {
        return 0;
    }

    // 这里需要使用到 hash 表
    // 需要通过这个表来记录这个字符串中出现的元素
    HashMap<Character, Integer> map = new HashMap<>();
    int re = 0;
    int left = 0;
    int right = 0;

    // 首先通过 for 循环来针对这个字符串进行遍历
    for (int i = 0; i < s.length(); i++) {
        // 让右指针记录下当前的位置
        right = i;
        // 首先进行一下 if 判断，判断一下当前的这个元素是否已经被添加到 hash 表中
        if (map.containsKey(s.charAt(right))) {
            // 如果这个元素已经存在，此时将这个元素的 value 值 +1
            map.put(s.charAt(right), map.get(s.charAt(right)) + 1);
        } else {
            // 如果当前这个元素没有在表中，则进行首次添加
            map.put(s.charAt(right), 1);
        }

        // 之后就需要针对左指针进行调整
        while(map.get(s.charAt(right)) > 1) {
            map.put(s.charAt(left), map.get(s.charAt(left++)) - 1);
        }
        // 更新返回值
        re = Math.max(re, (right - left) + 1);
    }
    return re;
}
}
